﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using VSD.OneStopService.BLL;

public partial class Modules_TruongPhongXuLy : System.Web.UI.Page
{
    #region Declarations
    private SubscriberRepository resSubscriber = new SubscriberRepository();// Repository Người đăng ký hồ sơ
    private Service serviceInProfile = null;// Dich vụ đăng ký trong hồ sơ

    private ProfileDataRepository resProfileData = new ProfileDataRepository();// Repository dữ liệu hồ sơ
    private ProfileStoreRepository ProfRepos;
    private ProfileHistoryRepository resHistory = new ProfileHistoryRepository();// Repository Lịch sử tiếp nhận, xử lý và trả hồ sơ

    private List<ProfileData> profileData = new List<ProfileData>();// Dữ liệu chi tiết của hồ sơ - Trong trường hợp dịch vụ công mức 3
    private List<string> elementIDs = new List<string>();// ID các thành phần HS được nộp khi tiếp nhận HS - Trong trường hợp không phải là DVC mức 3

    private MixProfileRepository resMixProfile = new MixProfileRepository();
    private MixResolvedRepository resMixResolved = new MixResolvedRepository();

    private int profileID = 0;// ID hồ sơ đang xử lý
    private int serviceID = 0;// ID của dịch vụ thuộc hồ sơ đang xử lý
    private int departmentID = 0;// ID phòng quản lý, giải quyết dịch vụ
    private bool isFullService = false; // Xác định có phải là dịch vụ công mức 3 hay không
    private string currentUserName = string.Empty;
    private bool allowEdit = false;// Cho phép edit form
    private bool setStatus2KhongDat = false;

    private bool IsDirector = false;
    private bool IsManager = false;
    private bool IsResolver = false;
    private bool CanSign = false;
    private bool IsViewAll = false;
    string ItemID = string.Empty;
    #endregion


    protected void Page_Load(object sender, EventArgs e)
    {
        IsDirector = ContextUser.PermissionCollection.HasPermission(PermissionCode.LANHDAO_COQUAN); //Cho phep quan tri co quyen nhu lanh dao co quan
        //----Cho phép lãnh đạo phòng cập nhật xử lý thay ãnh đạo----
        IsManager = ContextUser.PermissionCollection.HasPermission(PermissionCode.LANHDAO_PHONG_CHUYENMON);
        //----Cho phép chuyên viên cập nhật xử lý thay lãnh đạo---- 
        IsResolver = ContextUser.PermissionCollection.HasPermission(PermissionCode.CHUYENVIEN_XULY);
        CanSign = ContextUser.PermissionCollection.HasPermission(PermissionCode.KY_HOSO);
        IsViewAll = ContextUser.PermissionCollection.HasPermission(PermissionCode.XEM_TOANBO_HOSO);

        ProfRepos = new ProfileStoreRepository();
        ItemID = Request.QueryString["id"].ToString();
        if (!IsPostBack)
        {
            if (HttpContext.Current.Session["AdminLogined"] == null)
            {
                if (!ContextUser.IsLogged)
                {
                    Response.Redirect("../Login.aspx");
                }

            }
            if (Request["id"] == null)
            {
                return;
            }
            
            if (ItemID != null)
            {
                ProfileStoreItem.profileItem = ProfRepos.Get(int.Parse(ItemID));

                if (ProfileStoreItem.profileItem != null)
                {
                    allowEdit = AllowEdit(ProfileStoreItem.profileItem);
                    profileID = int.Parse(ItemID);
                    departmentID = ProfileStoreItem.profileItem.DepartmentID.Value;

                    FillDatas(ProfileStoreItem.profileItem);
                    BindYkienPhoiHop(ProfileStoreItem.profileItem.ID);
                    BindCboTPLanhDao(ProfileStoreItem.profileItem.ApprovedUserName);
                    BindCboLanhDaoCQ();

                    Permission();
                }
            }
        }
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        serviceInProfile = ProfileStoreItem.profileItem.Service;
        if (serviceInProfile != null)
        {
            this.BindGridHoSo();
            serviceID = serviceInProfile.ID;
            isFullService = (serviceInProfile.IsFullService != null && serviceInProfile.IsFullService.Value);

            if (isFullService)
                profileData = resProfileData.GetProfileDatasByProfileStoreID(ProfileStoreItem.profileItem.ID);
            else
                elementIDs = ProfileStoreItem.profileItem.ElementIds.Split(',').ToList();
        }
    }

    #region phân quyền người dùng
    public void Permission()
    {
        if (ProfileStoreItem.profileItem.Status == (byte)ServiceStatusCode.CodeValue.da_ky || ProfileStoreItem.profileItem.Status == (byte)ServiceStatusCode.CodeValue.khong_dat)
        {
            lbReturnCaption.Text = "(" + ServiceStatusCode.CodeName(ProfileStoreItem.profileItem.Status) + " - Chuyển trả một cửa)";
        }
        else
        {
            lbReturnCaption.Text = "(Hồ sơ không đạt - Chuyển trả một cửa)";
            setStatus2KhongDat = true;
        }

        if (IsDirector) // form lanh dao xu ly
        {
            panelForLD.Visible = true;
            panelForTP.Visible = false;
            panelForCV.Visible = false;
            lblLanhDao.Text = "Lảnh đạo cơ quan - Xử lý hồ sơ";
        }
        else if (IsManager) // form truong phong xu ly
        {
            panelForTP.Visible = true;
            panelForLD.Visible = false;
            panelForCV.Visible = false;
            lblLanhDao.Text = "Lảnh đạo phòng - Xử lý hồ sơ";
        }
        else if (IsResolver) // form chuyen vien xu ly
        {
            panelForCV.Visible = true;
            panelForTP.Visible = false;
            panelForLD.Visible = false;
            lblLanhDao.Text = "Chuyên viên - Xử lý hồ sơ";
        }
    }
    #endregion


    private bool AllowEdit(ProfileStore profileObject)
    {
        bool returnValue = false;
        currentUserName = ContextUser.CurrentUser.UserName;
        if ((profileObject.Status == (byte)ServiceStatusCode.CodeValue.da_ky) || (profileObject.Status == (byte)ServiceStatusCode.CodeValue.dat) || (profileObject.Status == (byte)ServiceStatusCode.CodeValue.khong_dat))
        {
            returnValue = (ContextUser.PermissionCollection.HasPermission(PermissionCode.LANHDAO_PHONG_CHUYENMON) && (currentUserName == ProfileStoreItem.profileItem.ResolveUserName || currentUserName == ProfileStoreItem.profileItem.ApprovedUserName));
        }
        else
        {
            returnValue = (ContextUser.PermissionCollection.HasPermission(PermissionCode.LANHDAO_PHONG_CHUYENMON) && (currentUserName == ProfileStoreItem.profileItem.ResolveUserName || string.IsNullOrEmpty(ProfileStoreItem.profileItem.ResolveUserName)));
        }
        btnSave.Enabled = returnValue;

        //--------------Trường hợp một cửa chuyển trực tiếp cho chuyên viên----------
        if (string.IsNullOrEmpty(profileObject.ApprovedUserName))
        {
            btnSave.Enabled = true;
            return true;
        }
        //---------------------------------------------------------------------------
        return returnValue;
    }

    private void FillDatas(ProfileStore profile)
    {
        Subscriber subscriberItem = resSubscriber.Get(profile.SubscriberID.Value);

        lbTenHS.Text = "Hồ sơ: " + profile.ServiceName;        //Hồ sơ: Cấp giấy phép xuất bản bản tin 
        lbMaHoSo.Text = profile.ProfileCode;
        lbNgayNop.Text = string.Format("{0:dd/MM/yyyy}", profile.RegDate.Value);
        lbTenNguoiNop.Text = profile.SubscriberName;
        lbSoChucThuc.Text = subscriberItem.IdentityNumber;
        lbDiaChi.Text = subscriberItem.Address;
        lbSoDienThoai.Text = (string.IsNullOrEmpty(subscriberItem.HomeFoneNumber) ? subscriberItem.MobiNumber : subscriberItem.HomeFoneNumber);
        lbThuDienTu.Text = subscriberItem.Email;
        lbTrangThai.Text = ServiceStatusCode.CodeName(profile.Status);
        txtKetLuan.Text = profile.Conclusion;
    }

    public void BindGridHoSo() // Thành phần hồ sơ
    {
        rptHoSo.DataSource = resProfileData.GetElementsByProfileID(profileID);
        rptHoSo.DataBind();
    }
    private void BindYkienPhoiHop(int profileId)// Bind thông tin phối hợp xử lý
    {
        rptYkienPhoiHop.DataSource = resMixResolved.GetMixResolvedByProfileID(profileId);
        rptYkienPhoiHop.DataBind();
    }

    private void BindCboLanhDaoCQ()
    {
        List<Staff> dataSource = new List<Staff>();
        List<Staff> lanhDaoPhongKy = new List<Staff>();
        foreach (Staff item in ContextUser.DSLanhDaoPhong)
        {
            lanhDaoPhongKy.Add(item);
        }
        dataSource.AddRange(ContextUser.DSLanhDaoCQ.Where(t => t.ID != ContextUser.CurrentUser.ID).ToList());
        PermissionManager pFilter = new PermissionManager(ContextUser.UserName);
        if (!pFilter.HasPermission(PermissionCode.LANHDAO_COQUAN) && !pFilter.HasPermission(PermissionCode.LANHDAO_VP))
            dataSource.AddRange(lanhDaoPhongKy);
        cboTP_CoQuan.DataSource = dataSource;
        cboTP_CoQuan.DataTextField = "Name";
        cboTP_CoQuan.DataValueField = "UserName";
        cboTP_CoQuan.DataBind();
    }

    private void BindCboTPLanhDao(string selectedUserName)
    {
        //try
        //{
        List<Staff> DSTruongPhong = new List<Staff>();

        foreach (Staff s in ContextUser.DSLanhDaoPhong)
        {
            if (s.DepartmentID == departmentID)
            {
                DSTruongPhong.Add(s);
            }
        }
        //--------Them danh sach LD co quan vao phần chuyển của chuyên viên--------
        if (ContextUser.GlobalOption.EnabledMoveToSign.HasValue && ContextUser.GlobalOption.EnabledMoveToSign.Value)
            DSTruongPhong.AddRange(ContextUser.DSLanhDaoCQ);

        cboCV_LanhDao.DataSource = DSTruongPhong;
        cboCV_LanhDao.DataTextField = "Name";
        cboCV_LanhDao.DataValueField = "UserName";
        cboCV_LanhDao.DataBind();
        //}
        //catch
        //{
        //    cboCV_LanhDao.DataSource = ContextUser.DSLanhDaoPhong;
        //    cboCV_LanhDao.DataTextField = "Name";
        //    cboCV_LanhDao.DataValueField = "UserName";
        //    cboCV_LanhDao.DataBind();
        //}

        if (!string.IsNullOrEmpty(selectedUserName))
            cboCV_LanhDao.SelectedValue = selectedUserName;
    }


    protected void btnSave_Click(object sender, EventArgs e)
    {
        if (ProfileStoreItem.profileItem != null)
        {
            SaveProfileTP();
            Page.Response.Write("Ho so luu thanh cong ");
        }

    }

    #region Lưu dữ liệu vào profile
    private void SaveProfile()
    {
        bool addLog = false;
        string actionName = string.Empty;
        string moveTo = string.Empty;
        string userName = string.Empty;
        string name = string.Empty;

        ProfileStore savingProfile = ProfRepos.Get(ProfileStoreItem.profileItem.ID);
        if (savingProfile.Status != (byte)ServiceStatusCode.CodeValue.dang_xu_ly)
        {
            //========Cho ghi log, gán giá trị cho ActionName========
            savingProfile.Status = (byte)ServiceStatusCode.CodeValue.dang_xu_ly;
            addLog = true;
            actionName = "Hồ sơ đang xử lý";
            //=======================================================
        }
        #region lanh dao xu ly
        if (IsDirector)
        {
            savingProfile.Conclusion = txtKetLuan.Text.Trim();
            savingProfile.DepartmentID = departmentID;
            savingProfile.Result = true;
            if ((string.IsNullOrEmpty(savingProfile.ResolveUserName) || savingProfile.ResolveUserName == ContextUser.UserName) && (savingProfile.Status == (byte)ServiceStatusCode.CodeValue.cho_xu_ly))
            {
                savingProfile.Status = (byte)ServiceStatusCode.CodeValue.dang_xu_ly;
                savingProfile.ResolveUserName = ContextUser.CurrentUser.UserName;
                savingProfile.ApprovedUserName = ContextUser.CurrentUser.UserName;
                savingProfile.ForwardDate = DateTime.Now;
            }
            if (string.IsNullOrEmpty(savingProfile.ResolveUserName))
                savingProfile.ResolveUserName = currentUserName;

            if (radLD_KyHS.Checked)
            {
                savingProfile.SignedUserName = currentUserName;
                savingProfile.SignedName = ContextUser.CurrentUser.Name;
                savingProfile.Status = (byte)ServiceStatusCode.CodeValue.da_ky;
                savingProfile.SignedDate = DateTime.Now;
                savingProfile.Result = true;
                //========Cho ghi log, gán giá trị cho ActionName========
                addLog = true;
                actionName = "Lãnh đạo đã ký hồ sơ";
                //=======================================================

                Page.Response.Write("Ho so " + savingProfile.ProfileCode + " da duoc xu ly va chuyen den bo phan mot cua cho tra ket qua!");
            }
            if (radLD_traMotCua.Checked)
            {
                if ((savingProfile.Status == (byte)ServiceStatusCode.CodeValue.khong_dat) || (savingProfile.Status == (byte)ServiceStatusCode.CodeValue.da_ky))
                {
                    savingProfile.DepartmentReturn = DateTime.Now;
                    savingProfile.IsWaitReturn = true;
                    savingProfile.Result = true;
                    //========Cho ghi log, gán giá trị cho ActionName========
                    addLog = true;
                    actionName = "Hồ sơ đã chuyển ra bộ phận một cửa";
                    //=======================================================
                }

                if (savingProfile.Status == (byte)ServiceStatusCode.CodeValue.cho_xu_ly)
                {
                    savingProfile.SignedUserName = currentUserName;
                    savingProfile.SignedName = ContextUser.CurrentUser.Name;
                    savingProfile.SignedDate = DateTime.Now;
                    savingProfile.Status = (byte)ServiceStatusCode.CodeValue.khong_dat;
                    savingProfile.DepartmentReturn = DateTime.Now;
                    savingProfile.IsWaitReturn = true;
                    savingProfile.Result = true;
                    //========Cho ghi log, gán giá trị cho ActionName========
                    addLog = true;
                    actionName = "Hồ sơ đã chuyển ra bộ phận một cửa";
                    //=======================================================
                }

                if (savingProfile.Status == (byte)ServiceStatusCode.CodeValue.cho_ky)
                {
                    savingProfile.SignedUserName = currentUserName;
                    savingProfile.SignedName = ContextUser.CurrentUser.Name;
                    savingProfile.SignedDate = DateTime.Now;
                    savingProfile.Status = (byte)ServiceStatusCode.CodeValue.khong_dat;
                    savingProfile.IsWaitReturn = false;
                    savingProfile.Result = true;
                    //savingProfile.Result = true;
                    //========Cho ghi log, gán giá trị cho ActionName========
                    addLog = true;
                    actionName = "Hồ sơ bị loại chờ chuyển ra bộ phận một cửa";
                    //=======================================================
                }
            }
        }
        #endregion
        #region truong phong xu ly
        else if (IsManager)
        {
            savingProfile.Conclusion = txtKetLuan.Text.Trim();
            //------------!!!--------------------
            if (string.IsNullOrEmpty(savingProfile.ApprovedUserName))
            {
                savingProfile.ApprovedUserName = ContextUser.CurrentUser.UserName;
            }
            //------------!!!--------------------
            if ((string.IsNullOrEmpty(savingProfile.ResolveUserName) || savingProfile.ResolveUserName == ContextUser.UserName) && (savingProfile.Status == (byte)ServiceStatusCode.CodeValue.cho_xu_ly))
            {
                savingProfile.Status = (byte)ServiceStatusCode.CodeValue.dang_xu_ly;
                savingProfile.ResolveUserName = ContextUser.CurrentUser.UserName;
                savingProfile.ForwardDate = DateTime.Now;
            }

            if (radTP_TrinhKy.Checked)
            {
                userName = cboCV_LanhDao.SelectedItem.Value;
                name = cboCV_LanhDao.SelectedItem.Text;

                savingProfile.ApprovedUserName = ContextUser.CurrentUser.UserName;
                savingProfile.SignedUserName = userName;
                savingProfile.SignedName = name;
                savingProfile.Status = (byte)ServiceStatusCode.CodeValue.cho_ky;
                savingProfile.MoveToApprove = DateTime.Now;
                savingProfile.MoveToSign = DateTime.Now;
                //========Cho ghi log, gán giá trị cho ActionName========
                addLog = true;
                actionName = "Trình lãnh đạo ký duyệt";
                moveTo = userName;
            }

            if (radTP_TraMotCua.Checked)
            {
                if (setStatus2KhongDat)
                    savingProfile.Status = (byte)ServiceStatusCode.CodeValue.khong_dat;
                savingProfile.ApprovedUserName = ContextUser.CurrentUser.UserName;
                savingProfile.DepartmentReturn = DateTime.Now;
                savingProfile.IsWaitReturn = true;
                //========Cho ghi log, gán giá trị cho ActionName========
                addLog = true;
                actionName = "Hồ sơ đã chuyển ra bộ phận một cửa";
            }
            savingProfile.Result = false;
            Page.Response.Write("Ho so " + savingProfile.ProfileCode + " da duoc xu ly va chuyen den bo phan mot cua cho tra ket qua!");
        }
        #endregion
        #region Chuyen vien xu ly
        else if (IsResolver)
        {
            savingProfile.Conclusion = txtKetLuan.Text.Trim();
            savingProfile.Status = (byte)ServiceStatusCode.CodeValue.dang_xu_ly;
            savingProfile.ResolveUserName = ContextUser.CurrentUser.UserName;

            if (radCV_Dat.Checked)
            {
                savingProfile.Status = (byte)ServiceStatusCode.CodeValue.dat;
                savingProfile.MoveToApprove = DateTime.Now;
                addLog = true;
                actionName = "Hồ sơ hoàn thành xử lý, chờ phê duyệt";
            }

            if (radCV_KhongDat.Checked)
            {
                savingProfile.Status = (byte)ServiceStatusCode.CodeValue.khong_dat;
                savingProfile.MoveToApprove = DateTime.Now;
                addLog = true;
                actionName = "Hồ sơ hoàn thành xử lý, chờ phê duyệt";
            }
            if (chkCV_LanhDao.Checked)
            {
                userName = cboCV_LanhDao.SelectedValue.ToString().ToLower();

                savingProfile.ApprovedUserName = userName;
                if (!radCV_Dat.Checked && !radCV_KhongDat.Checked)
                {
                    savingProfile.ResolveUserName = userName;
                    savingProfile.Status = (byte)ServiceStatusCode.CodeValue.cho_xu_ly;
                    savingProfile.MoveToApprove = DateTime.Now;
                }
                addLog = true;
                actionName = "Hồ sơ hoàn thành xử lý, chờ phê duyệt";
            }
            if (!savingProfile.IsWaitReturn)
                savingProfile.Result = false;
        }

        #endregion

        if (addLog)
        {
            //==========Ghi log xử lý hồ sơ=================
            ProfileHistory executeHistory = new ProfileHistory()
            {
                ProfileID = ProfileStoreItem.profileItem.ID,
                StatusID = savingProfile.Status,
                StatusName = ServiceStatusCode.CodeName(savingProfile.Status),
                ActionName = actionName,
                ActionBy = ContextUser.CurrentUser.UserName,
                ProcessBy = ContextUser.CurrentUser.UserName,
                ActionDate = DateTime.Now,
                Consumer = savingProfile.SubscriberName,
                MoveTo = moveTo,
                Conclusion = txtKetLuan.Text.Trim()
            };
            resHistory.Add(executeHistory);
            resHistory.SubmitChanges();
            //==========End ghi log xử lý hồ sơ==============
        }
        ProfRepos.SubmitChanges();
    }

    private void SaveProfileTP()
    {
        bool addLog = false;
        string actionName = string.Empty;
        string moveTo = string.Empty;
        string userName = string.Empty;
        string name = string.Empty;


        ProfileStore savingProfile = ProfRepos.Get(ProfileStoreItem.profileItem.ID);
        if (savingProfile.Status != (byte)ServiceStatusCode.CodeValue.dang_xu_ly)
        {
            //========Cho ghi log, gán giá trị cho ActionName========
            addLog = true;
            actionName = "Hồ sơ đang xử lý";
        }
        savingProfile.Conclusion = txtKetLuan.Text.Trim();
        if (string.IsNullOrEmpty(savingProfile.ApprovedUserName))
        {
            savingProfile.ApprovedUserName = ContextUser.CurrentUser.UserName;
        }
        if ((string.IsNullOrEmpty(savingProfile.ResolveUserName) || savingProfile.ResolveUserName == ContextUser.UserName) && (savingProfile.Status == (byte)ServiceStatusCode.CodeValue.cho_xu_ly))
        {
            savingProfile.Status = (byte)ServiceStatusCode.CodeValue.dang_xu_ly;
            savingProfile.ResolveUserName = ContextUser.CurrentUser.UserName;
            savingProfile.ForwardDate = DateTime.Now;
        }

        if (radTP_TrinhKy.Checked)
        {
            userName = cboTP_CoQuan.SelectedItem.Value;
            name = cboTP_CoQuan.SelectedItem.Text;
            savingProfile.ApprovedUserName = ContextUser.CurrentUser.UserName;
            savingProfile.SignedUserName = userName;
            savingProfile.SignedName = name;
            savingProfile.Status = (byte)ServiceStatusCode.CodeValue.cho_ky;
            savingProfile.MoveToApprove = DateTime.Now;
            savingProfile.MoveToSign = DateTime.Now;
            addLog = true;
            actionName = "Trình lãnh đạo ký duyệt";
            moveTo = userName;
        }

        if (radTP_TraMotCua.Checked)
        {
            if (setStatus2KhongDat)
                savingProfile.Status = (byte)ServiceStatusCode.CodeValue.khong_dat;
            savingProfile.ApprovedUserName = ContextUser.CurrentUser.UserName;
            savingProfile.DepartmentReturn = DateTime.Now;
            savingProfile.IsWaitReturn = true;
            addLog = true;
            actionName = "Hồ sơ đã chuyển ra bộ phận một cửa";
        }

        if (radCV_Dat.Checked)
        {
            savingProfile.Status = (byte)ServiceStatusCode.CodeValue.dat;
            savingProfile.MoveToApprove = DateTime.Now;
            addLog = true;
            actionName = "Hồ sơ hoàn thành xử lý, chờ phê duyệt";
        }
        if (radCV_KhongDat.Checked)
        {
            savingProfile.Status = (byte)ServiceStatusCode.CodeValue.khong_dat;
            savingProfile.MoveToApprove = DateTime.Now;
            addLog = true;
            actionName = "Hồ sơ hoàn thành xử lý, chờ phê duyệt";
        }
        if (chkCV_LanhDao.Checked)
        {
            userName = cboCV_LanhDao.SelectedItem.Value;
            savingProfile.ApprovedUserName = userName;
            addLog = true;
            actionName = "Hồ sơ hoàn thành xử lý, chờ phê duyệt";
            moveTo = userName;
        }
        if (addLog)
        {
            //==========Ghi log xử lý hồ sơ=================
            ProfileHistory executeHistory = new ProfileHistory()
            {
                ProfileID = ProfileStoreItem.profileItem.ID,
                StatusID = savingProfile.Status,
                StatusName = ServiceStatusCode.CodeName(savingProfile.Status),
                ActionName = actionName,
                ActionBy = ContextUser.CurrentUser.UserName,
                ProcessBy = ContextUser.CurrentUser.UserName,
                ActionDate = DateTime.Now,
                Consumer = savingProfile.SubscriberName,
                MoveTo = moveTo,
                Conclusion = txtKetLuan.Text.Trim()
            };
            resHistory.Add(executeHistory);
            resHistory.SubmitChanges();
        }
        if (!savingProfile.IsWaitReturn)
            savingProfile.Result = false;
        ProfRepos.SubmitChanges();
    }
    #endregion


    protected void btnChuyenXL_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Modules/ChuyenXuLy.aspx?id=" + ProfileStoreItem.profileItem.ID);
    }
}